package com.mi.rule.util;

/**
 * 金额转换：数字金额转大写
 * 小数部分两位数，整数部分最大长度为16位
 * <p>转换规则：<br>
 * 中文大写金额数字到"元"为止的，在"元"之后，应写"整"(或"正")字。<br>
 * 在"角"之后，可以不写"整"(或"正")字。大写金额数字有"分"的，"分"后面不写"整"(或"正")字。<br>
 * 中文大写金额数字前应标明"人民币"字样。<br>
 * 阿拉伯数字中间有"0"时，中文大写要写"零"字。<br>
 * 阿拉伯数字中间连续有几个"0"时，中文大写金额中间可以只写一个"零"字。<br>
 * 阿拉伯金额数字万位和元位是"0"；或者数字中间连续有几个"0"，万位、元位也是"0"，但千位、角位不是"0"时，中文大写金额中可以只写一个零字，也可以不写"零"字。<br>
 * 阿拉伯金额数字角位是"0"，而分位不是"0"时，中文大写金额"元"后面应写"零"字。</p>
 */
class AmountConversion {
    //    大写阿拉伯数字
    private static final String[] UP_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    //    大写金额单位
    private static final String[] AMOUNT_UNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟"};
    // 转换结果
    private String sAmountInWords = "";

    //结果
    public String result() {
        return sAmountInWords;
    }

    public AmountConversion(String inputMoney) {
        //
        //         * 如果金额字符串包含小数点，分割整数与小数部分；否则转换整数部分并添加“整”字；<br>
        //         * 包含小数点：<br>
        //         * 			如果小数部分为0，转换整数后添加“整”字；<br>
        //         * 			如果整数和小数部分都为0，转换结果为“人民币零元整”<br>
        //         * 			否则，整数转换结果拼接小数转换结果<br>
        //         * 最终结果开头要添加“人民币”
        //
        if (inputMoney.contains(".")) {
//            if (inputMoney.endsWith("0")) {
//                inputMoney = inputMoney.substring(0, inputMoney.length() - 1);
//            }
            String[] money = inputMoney.split("\\.");
            if ((money[0].length() == 1 && Integer.parseInt(money[0]) == 0) && Integer.parseInt(money[1]) == 0) {
                this.sAmountInWords = "零元" + "整";
                return;
            }

            if (!(money[0].length() == 1 && Integer.parseInt(money[0]) == 0)) {
                this.sAmountInWords += getIntegerAmountInWords(money[0]);
            }

            if (Integer.parseInt(money[1]) == 0) {
                this.sAmountInWords += "整";
            }

            if (Integer.parseInt(money[1]) != 0) {
                this.sAmountInWords += getDecimalAmountInWords(money[1]);
            }

            return;
        }

        if (inputMoney.length() == 1 && Integer.parseInt(inputMoney) == 0) {
            this.sAmountInWords = "零元整";
        } else {
            this.sAmountInWords = getIntegerAmountInWords(inputMoney) + "整";
        }
    }

    /**
     * 整数部分大写金额
     *
     * @param integerMoney 整数金额
     */
    private String getIntegerAmountInWords(String integerMoney) {
        StringBuilder sIntegerAmountInWords = new StringBuilder();
        int iNext;

        //         * 遍历：
        //         * 1、非0数字转大写并加上单位<br>
        //         * 2、对0的处理（下标为i的字符为0）：<br>
        //         * 		（1）如：100,0000,0001等中间的一组4个0不做任何处理，直接跳过<br>
        //         * 		（2）“拾”位低一位为0， 不加“零”，直接加单位<br>
        //         * 		（3）其他情况，0（当前i下标字符为0）遇非0时补“零”
        for (int i = 0, j = integerMoney.length() - 1; i < integerMoney.length(); i++, j--) {
            if (integerMoney.charAt(i) != '0') {
                sIntegerAmountInWords.append(UP_NUMBER[integerMoney.charAt(i) - '0']).append(AMOUNT_UNIT[j]);
            } else {
                if (i + 4 < integerMoney.length() && AMOUNT_UNIT[j].equals("仟") && integerMoney.substring(i, i + 4).equals("0000")) {
                    i = i + 3;
                    j = j - 3;
                    continue;
                }

                iNext = i + 1;
                if (iNext == integerMoney.length()) {
                    iNext = i;
                }

                if (AMOUNT_UNIT[j + 1].equals("拾")) {
                    sIntegerAmountInWords.append(AMOUNT_UNIT[j]);
                } else if (integerMoney.charAt(iNext) != '0') {
                    sIntegerAmountInWords.append("零");
                }
            }
        }
        return sIntegerAmountInWords.toString();
    }

    /**
     * 小数部分大写金额
     *
     * @param decimalMoney 小数金额
     */
    private String getDecimalAmountInWords(String decimalMoney) {
        String sDecimalAmountInWords = "";

        //         * 1、阿拉伯金额数字角位不是‘0’，数字转大写并添加“角”<br>
        //         * 2、如果存在“分”位，并且分位不是‘0’，数字转大写并添加“分”
        if (decimalMoney.length() > 0) {
            if (decimalMoney.charAt(0) != '0') {
                sDecimalAmountInWords += UP_NUMBER[decimalMoney.charAt(0) - '0'] + "角";
            }
            if (decimalMoney.length() > 1 && decimalMoney.charAt(1) != '0') {
                sDecimalAmountInWords += UP_NUMBER[decimalMoney.charAt(1) - '0'] + "分";
            }
        }
        return sDecimalAmountInWords;
    }

}